package com.order.manager.filter;

import com.order.manager.Model.UserInfo;
import com.order.manager.service.AuthUserDetailService;
import com.order.manager.service.impl.UserInfoServiceImpl;
import com.order.manager.util.JwtUtil;
import io.jsonwebtoken.Claims;
import jakarta.annotation.Resource;
import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter;

import java.io.IOException;
import java.util.Arrays;
import java.util.List;

/**
 * JWT过滤器：拦截所有HTTP请求，验证JWT令牌并设置用户认证信息
 * 继承OncePerRequestFilter确保每个请求只被过滤一次
 */
@Component
@Slf4j
public class JwtFilter extends OncePerRequestFilter {

    @Resource
    JwtUtil jwtUtil; // JWT工具类，用于生成、解析和验证令牌

    @Resource
    AuthUserDetailService userService; // 用户详情服务，用于加载用户信息

    @Resource
    UserInfoServiceImpl userInfoServiceImpl; // 用户信息服务，用于获取用户详细信息

    // 定义不需要JWT验证的路径（新增代码）
    private static final List<String> EXCLUDED_PATHS = Arrays.asList(
            "/api/teamitem/**",
            "/api/teamuser/**",
            "/api/team/**",  // 团队管理API路径排除
            "/api/login",   // 示例：登录接口（可根据需求添加）
            "/api/register" // 示例：注册接口（可根据需求添加）
    );

    /**
     * 核心过滤逻辑：验证请求头中的JWT令牌并设置安全上下文
     */
    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
            throws ServletException, IOException {
        // 1. 先检查请求路径是否在排除列表中（新增逻辑）
        String requestPath = request.getRequestURI();
        if (EXCLUDED_PATHS.stream().anyMatch(requestPath::startsWith)) {
            filterChain.doFilter(request, response);
            return;
        }

        // 2. 原有的JWT令牌验证逻辑
        String jwtToken = request.getHeader("token");
        if (jwtToken != null && !jwtToken.isEmpty() && jwtUtil.checkToken(jwtToken)) {
            try {
                Claims claims = jwtUtil.getTokenBody(jwtToken);
                String uuid = (String) claims.get("username");
                UserInfo byId = userInfoServiceImpl.getById(uuid);
                UserDetails user = userService.loadUserByUsername(byId.getUsername());

                if (user != null) {
                    UsernamePasswordAuthenticationToken auth =
                            new UsernamePasswordAuthenticationToken(user, null, user.getAuthorities());
                    SecurityContextHolder.getContext().setAuthentication(auth);
                }
            } catch (Exception e) {
                log.error("JWT解析失败: {}", e.getMessage());
            }
        } else {
            log.warn("token is null or empty or out of time, probably user is not log in !");
        }

        // 3. 传递请求到下一个过滤器
        filterChain.doFilter(request, response);
    }
}
//package com.order.manager.filter;
//
//import com.order.manager.Model.UserInfo;
//import com.order.manager.service.AuthUserDetailService;
//import com.order.manager.service.impl.UserInfoServiceImpl;
//import com.order.manager.util.JwtUtil;
//import io.jsonwebtoken.Claims;
//import jakarta.annotation.Resource;
//import jakarta.servlet.FilterChain;
//import jakarta.servlet.ServletException;
//import jakarta.servlet.http.HttpServletRequest;
//import jakarta.servlet.http.HttpServletResponse;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
//import org.springframework.security.core.context.SecurityContextHolder;
//import org.springframework.security.core.userdetails.UserDetails;
//import org.springframework.stereotype.Component;
//import org.springframework.web.filter.OncePerRequestFilter;
//
//import java.awt.*;
//import java.io.IOException;
//import java.util.Arrays;
//
///**
// * JWT过滤器：拦截所有HTTP请求，验证JWT令牌并设置用户认证信息
// * 继承OncePerRequestFilter确保每个请求只被过滤一次
// */
//@Component
//@Slf4j
//public class JwtFilter extends OncePerRequestFilter {
//
//    @Resource
//    JwtUtil jwtUtil; // JWT工具类，用于生成、解析和验证令牌
//
//    @Resource
//    AuthUserDetailService userService; // 用户详情服务，用于加载用户信息
//
//    @Resource
//    UserInfoServiceImpl userInfoServiceImpl; // 用户信息服务，用于获取用户详细信息
//
//
//
//    /**
//     * 核心过滤逻辑：验证请求头中的JWT令牌并设置安全上下文
//     *
//     * @param request  HTTP请求
//     * @param response HTTP响应
//     * @param filterChain 过滤器链，用于将请求传递给下一个过滤器
//     *
//     */
//    @Override
//    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
//            throws ServletException, IOException {
//        // 1. 从请求头中获取JWT令牌
//        String jwtToken = request.getHeader("token"); // 从"token"请求头中获取JWT
////        log.info(jwtToken);
//
//        // 2. 检查令牌是否存在且有效
//        if (jwtToken != null && !jwtToken.isEmpty() && jwtUtil.checkToken(jwtToken)) {
//            try { // 令牌存在且有效，开始解析
//                // 3. 解析JWT令牌，获取Claims（包含用户信息）
//                Claims claims = jwtUtil.getTokenBody(jwtToken);
//
//                // 4. 从Claims中获取用户名（实际存储的是用户UUID）
//                String uuid = (String) claims.get("username"); // 注意：这里的"username"实际存储的是用户UUID
////                System.out.println(uuid);
//
//                // 5. 通过UUID从数据库获取用户详细信息
//                UserInfo byId = userInfoServiceImpl.getById(uuid);
//
//                // 6. 通过用户名加载Spring Security的UserDetails对象
//                UserDetails user = userService.loadUserByUsername(byId.getUsername());
//
//                // 7. 设置安全上下文，完成用户认证
//                if (user != null) {
//                    // 创建认证令牌（已认证状态，无需密码，包含用户权限）
//                    UsernamePasswordAuthenticationToken auth =
//                            new UsernamePasswordAuthenticationToken(user, null, user.getAuthorities());
//
//                    // 将认证信息设置到安全上下文中，后续请求可获取当前用户信息
//                    SecurityContextHolder.getContext().setAuthentication(auth);
//                }
//            } catch (Exception e) {
//                // 令牌解析失败（可能已过期、签名错误等）
//                log.error("JWT解析失败: {}", e.getMessage());
//            }
//        } else {
//            // 令牌不存在或无效，可能用户未登录
//            log.warn("token is null or empty or out of time, probably user is not log in !");
//        }
//
//        // 8. 将请求传递给下一个过滤器（无论是否认证成功都继续）
//        filterChain.doFilter(request, response);
//    }
//}
